package com.flydog.taskManager.service;

import com.flydog.taskManager.dto.AdminUserParam;
import com.flydog.taskManager.dto.UpdateAdminPasswordParam;
import com.flydog.taskManager.entity.user.AdminPermission;
import com.flydog.taskManager.entity.user.AdminRole;
import com.flydog.taskManager.entity.user.AdminUser;
import org.springframework.data.domain.Page;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.List;
import java.util.Optional;

public interface AdminUserService {

    /**
     * 根据userName获取用户信息
     * @param name 用户名称
     * @return 用户信息
     */
    Optional<AdminUser> getUserByName(String name);

    /**
     * 注册用户
     * @param param 用户信息
     * @return 注册后的信息
     */
    AdminUser register(AdminUserParam param);

    /**
     * 用户使用用户名和密码登陆
     * @param name 用户名
     * @param password 密码
     * @return 用户token
     */
    String login(String name, String password);

    /**
     * 根据用户名或昵称分页查询用户
     *
     * @param keyword  用户名或昵称
     * @param pageSize 页面大小
     * @param pageNum  页码
     * @return 用户列表
     */
    Page<AdminUser> list(String keyword, Integer pageSize, Integer pageNum);

    /**
     * 获取指定用户
     * @param id 用户ID
     * @return 用户信息
     */
    Optional<AdminUser> getUser(Long id);

    /**
     * 删除指定用户
     * @param id 用户ID
     * @return 被删除的用户信息
     */
    AdminUser delete(Long id);

    /**
     * 修改指定用户的信息
     * @param id 用户ID
     * @param param 需修改的信息
     * @return 修改的用户信息
     */
    AdminUser update(Long id, AdminUserParam param);

    /**
     * 获取所有角色列表
     * @return 角色列表
     */
    List<AdminRole> getRoleList();

    /**
     * 获取指定用户的角色列表
     * @param adminId 用户ID
     * @return 角色列表
     */
    List<AdminRole> getRoleList(Long adminId);

    /**
     * 获取所有的权限列表
     * @return 权限列表
     */
    List<AdminPermission> getPermissionList();

    /**
     * 获取指定角色的权限列表
     * @param roleId 角色ID
     * @return 权限列表
     */
    List<AdminPermission> getPermissionList(Long roleId);

    /**
     * 修改密码
     * @param updatePasswordParam 修改密码提交数据
     * @return 修改状态
     */
    int updatePassword(UpdateAdminPasswordParam updatePasswordParam);

    /**
     * 修改用户的角色列表
     * @param userId 用户ID
     * @param roleIds 用户的角色ID
     * @return 修改的数量
     */
    int updateRole(Long userId, Long[] roleIds);

    /**
     * 修改角色的权限列表
     * @param roleId 角色ID
     * @param permissionIds 权限ID
     * @return 修改的数量
     */
    int updatePermission(Long roleId, Long[] permissionIds);

    /**
     * 通过用户名生成security用户信息
     * @param username 用户名
     * @return security用户信息
     */
    UserDetails loadUserByUsername(String username);
}
